package versao;

public class Metodos {
	int np = 0;
	
	public Metodos(int np){
		this.np = np;
	}
	
	public int initMetodos(String mat, int metodo){	
		switch(metodo){
			case(1):
				return metodoUm(mat);
				//break;
			case(2):
				return metodoDois(mat);
				//break;
			case(3):
				return metodoTres(mat);
				//break;
			case(4):
				return metodoQuatro(mat);
				//break;
			case(5):
				return metodoCinco(mat);
				//break;
			case(6):
				return metodoSeis(mat);
				//break;
			case(7):
				return metodoSete(mat);		
		}
		return metodo;
	}
	
	public int metodoUm(String mat){
		int i;
		int fim = 0;
		for(i = 0; i <= mat.length()-1;i++)
			fim = fim + Character.digit(mat.charAt(i),10);
		fim = fim%np;
		//System.out.println("[M1]Resultado final: "+fim);
		return fim;
	}
	
	public int metodoDois(String mat){
		int i;
		int fim = 0;
		int matricula = Integer.parseInt(mat);
		String matAux = Integer.toBinaryString(matricula);
		
		for(i = 0;i < matAux.length(); i++)
			fim = fim + Character.digit(matAux.charAt(i),10);
		fim = fim%np;

		//System.out.println("[M2]Resultado final: "+fim);
		return fim;
	}
	
	public int metodoTres(String mat){
		int i;
		int fim = 0;
		int matricula = Integer.parseInt(mat);
		String matAux = Integer.toBinaryString(matricula);
		String subMat = null;
		int aux = 0;

		for(i = matAux.length(); i > 0; i--){
			if(i-4 > 0)
				subMat = matAux.substring(i-4, i);
			else
				subMat = matAux.substring(0, i);
			aux = Integer.parseInt(subMat, 2);
			fim = fim + aux;
			i = i-3;
		}
		fim = fim%np;
			
		//System.out.println("[M3]Resultado final: "+fim);
		return fim;
	}
	
	public int metodoQuatro(String mat){
		int i;
		int j = 0;
		int fim = 0;
		char aux;
		
		for(i = mat.length()-1; i >= 0; i--){
			aux = mat.charAt(i);
			fim = fim + Character.digit(aux, 10)*j++;
		}
		fim = fim%np;
		
		//System.out.println("[M4]Resultado final: "+fim);
		return fim;
	}
	
	public int metodoCinco(String mat){
		int i;
		int fim = 0;
		int pos = 0;
		int neg = 0;
		
		for(i = 0; i <= mat.length()-1;i++){
			pos = Character.digit(mat.charAt(i),10);
			if(i+1 < mat.length()-1)
				neg = Character.digit(mat.charAt(i+1),10);
			else
				neg = 0;
			i++;
			fim = fim + (pos - neg);
		}
		if(fim<0)
			fim = fim*(-1);
		fim = fim%np;
				
		//System.out.println("[M5]Resultado final: "+fim);
		return fim;
	}
	
	public int metodoSeis(String mat){
		char primeiro = mat.charAt(0);
		char ultimo = mat.charAt(mat.length()-1);
				
		int p = Character.digit(primeiro, 10);
		int u = Character.digit(ultimo, 10);
		int fim = (p + u)%np;
		
		//System.out.println("[M6]Resultado final: "+fim);
		return fim;
	}
	
	public int metodoSete(String mat){
		mat = mat.substring(mat.length()-3);
		int fim = Integer.parseInt(mat)%np;
		
		//System.out.println("[M7]Resultado final: "+fim);
		return fim;
	}
}
